#ifndef CTAGAME_H
#define CTAGAME_H

#include <crystalspace.h>

struct iJoystickDriver;

enum game_state {eInit, eIntro, eMenuInit, eMenu, eGameInit, eGame, eExit};

class ctaGame : public csApplicationFramework, public csBaseEventHandler
{
private:
    std::string game_type;
public:

/// A pointer to the configuration manager.
    csRef<iConfigManager> confman;
    csRef<iVFS> fs;
    csRef<iDataBuffer> data;

/// A pointer to the cel billboard
//	csRef<iCelPlLayer> pl;
//	csRef<iCelBlLayer> bltest;

  bool Setup ();

  /// A pointer to the 3D engine.
  csRef<iEngine> engine;

  /// A pointer to the map loader plugin.
  csRef<iLoader> loader;

  /// A pointer to the plugin manager plugin
  csRef<iPluginManager> plugin_mgr;

  /// A pointer to the model loader plugin
  csRef<iModelLoader> model_ldr;

  /// A pointer to the 3D renderer plugin.
  csRef<iGraphics3D> g3d;

  /// A pointer to the keyboard driver.
  csRef<iKeyboardDriver> kbd;

  /// A pointer to the virtual clock.
  csRef<iVirtualClock> vc;

  /// A pointer to the collision detection system.
  csRef<iCollideSystem> cdsys;

  csRef<iReporter> reporter;

  /// A Pointer to the reporter listener
  csRef<iStandardReporterListener> listener;

  /// A Pointer to the Sound Renderer
  csRef<iSndSysRenderer> sndrenderer;

  /// A pointer to the sector the camera will be in.
  iSector* room;


  /// Our collider used for gravity and CD.
  csColliderActor collider_actor;

  /**
   * Handle keyboard events - ie key presses and releases.
   * This routine is called from the event handler in response to a
   * csevKeyboard event.
   */
  bool OnKeyboard (iEvent&);

  /**
   * Setup everything that needs to be rendered on screen. This routine
   * is called from the event handler in response to a csevProcess
   * broadcast message.
   */
  void ProcessFrame ();

  /**
   * Finally render the screen. This routine is called from the event
   * handler in response to a csevFinalProcess broadcast message.
   */
  void FinishFrame ();

  bool LoadConfig();
public:
    ctaGame();

    /// Final cleanup.
    void OnExit ();

  /**
   * Main initialization routine. This routine will set up some basic stuff
   * (like load all needed plugins, setup the event handler, ...).
   * In case of failure this routine will return false. You can assume
   * that the error message has been reported to the user.
   */
    bool OnInitialize (int argc, char* argv[]);

  /**
   * Run the application.
   * First, there are some more initialization (everything that is needed
   * by cimGame to use Crystal Space), then this routine fires up the main
   * event loop. This is where everything starts. This loop will  basically
   * start firing events which actually causes Crystal Space to function.
   * Only when the program exits this function will return.
   */
    bool Application ();

    CS_EVENTHANDLER_NAMES ("application.cta")
    CS_EVENTHANDLER_NIL_CONSTRAINTS
};

#endif // CTAGAME_H
